www.gusucode.com > 串口测试程序,用于调试rs485接口 串口通信的程序 > 串口测试程序,用于调试rs485接口 串口通信的程序/commtest/MeterGB.cpp

    // MeterGB.cpp: implementation of the CMeterGB class.
//
//////////////////////////////////////////////////////////////////////
#include "MPGB.h"
#include "MeterGB.h"
#include "stdio.h"
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////


CMeterGB::CMeterGB()
{
//	printf("\r\nCMeterGB()");
	pMPBase = new CMPGB();
}
CMeterGB::CMeterGB( METERPARA meter)
{
//	printf("\r\nCMeterGB( METERPARA meter)");
	pMPBase = new CMPGB();
	memcpy(&m_meter,&meter,sizeof(METERPARA));
}

CMeterGB::~CMeterGB()
{

}
int CMeterGB::OnReadAllItems(int m_mask)
{
        int i;
//        time_t m_time,m_time1;
//        time( &m_time );
	if(m_mask & 0x01)
	{
		i = OnReadEnergy( );
#ifdef DBUG_PRO
		if( i == 0)
		{
			printf("\r\n采集电表%d电量数据 ---- OK!!!",m_meter.No);
		}
		else
		{
			printf("\r\n采集电表%d电量数据 ---- FALL!!!",m_meter.No);
		}
		
#endif
		
	}
	if(m_mask & 0x02)
	{
		i = OnReadPVC();
#ifdef DBUG_PRO
		if( i == 0)
		{
			printf("\r\n采集电表%d瞬时量数据 ---- OK!!!",m_meter.No);
		}
		else
		{
			printf("\r\n采集电表%d瞬时量数据 ---- FALL!!!",m_meter.No);
		}
		
#endif
	}
	if(m_mask & 0x04)
	{
		i = OnReadMD( );
#ifdef DBUG_PRO
		if( i == 0)
		{
			printf("\r\n采集电表%d需量数据 ---- OK!!!",m_meter.No);
		}
		else
		{
			printf("\r\n采集电表%d需量数据 ---- FALL!!!",m_meter.No);
		}
		
#endif
	}
	if(m_mask & 0x08 == 0x08)
	{
		i = OnReadEvent();
#ifdef DBUG_PRO
		if( i == 0)
		{
			printf("\r\n采集电表%d电表事件数据 ---- OK!!!",m_meter.No);
		}
		else
		{
			printf("\r\n采集电表%d电表事件数据 ---- FALL!!!",i);
		}
		
#endif
}

//	printf("\r\nmask:%02x",m_mask);
	if((m_mask & 0x10) == 0x10)
	{
		i = OnReadOther();
#ifdef DBUG_PRO
		if( i == 0)
		{
			printf("\r\n采集电表%d其他数据 ---- OK!!!",m_meter.No);
		}
		else
		{
			printf("\r\n采集电表%d其他数据 ---- FALL!!!",m_meter.No);
		}
		
#endif
	}

//	printf("\r\n USED TIME %d",m_time1 - m_time);	
	return 0;
}

int CMeterGB::OnReadEnergy( )
{
	int err = 0;
	int Item[ 6 ] = {0x901F,0x902F,0x913F,0x914F,0x915F,0x916F};
		
	for(int i = 0; i < 6 ;i++)
	{
		err <<= 1;
		if(!ReadItem( Item[i], RETRYNUM))
		{
			err |= 0x01;
		}
        }
	return err;
}
int CMeterGB::OnReadPVC()
{
	int err = 0;
	int Item[  ] = {
		0xB611,0xB612,0xB613,0xB621,0xB622,
		0xB623,0xB630,0xB631,0xB632,0xB633,
		0xB623,0xB640,0xB641,0xB642,0xB643,
		0xB650,0xB651,0xB652,0xB653,0
		};
	
	for(int i = 0; Item[i]; i++)
	{
		err <<= 1;		
		if(!ReadItem( Item[i], RETRYNUM))
		{
			err |= 0x01;
                
		}
	}
	return err;
}
int CMeterGB::OnReadMD( )
{
	int err = 0;
	int Item[ 4 ] = {0xA01F,0xA02F,0xB01F,0xB02F};
	for(int i = 0; i < 4; i++)
	{
		err <<= 1;
		if(!ReadItem( Item[i], RETRYNUM))
		{
			err |= 0x01;
		}
	}
	return err;
}
int CMeterGB::OnReadEvent()
{
	int err = 0;
	int Item[ 6 ] = {0xB210,0xB211,0xB212,0xB213,0xB31F,0xB32F};
	for(int i = 0; i < 6; i++)
	{
		err <<=1;
		if(!ReadItem( Item[i], RETRYNUM))
		{
			err |= 0x01;
		}
	}
	return err;
}
int CMeterGB::OnReadOther()
{
	int err = 0;
	int Item[ 5 ] = {0xC010,0xC011,0xC030,0xC031,0xC33F};//Ok
	for(int i = 0; i < 5; i++)
	{
		err <<=1;
		if(!ReadItem( Item[i], RETRYNUM))
		{
			err |= 0x01;
		}
	}
	return err;
}

bool CMeterGB::ReadItem(int Item, int RetryCount)
{	
	int FrmLen,RecvLen;
	BYTE tmp_buf[256];
	FrmLen = pMPBase->FormReadDataFrame(OutFram, Item, m_meter.com_para.addr);
	if(FrmLen == 0) 
	{
#ifdef DBUG_PRO
		printf("\r\n组织命令数据失败!!!!");
#endif
		return false;
	}
	int j = 0xFFFF,i;	
	for(i = 0; i < RetryCount; i ++)
	{
		if( !OnOpenCom() )
		{
		     continue;//串行口打开失败
		}

		Write(OutFram,FrmLen);	//发送帧
		if ( !WaitForReponse(TIME_SEC) ) //等待回应帧
		{
			OnCloseCom();
			continue;
		}
		RecvLen = Read(tmp_buf,sizeof(tmp_buf) );		//读取帧
		OnCloseCom();
		DataLen = 0;

                j = pMPBase->ProcReturnedFrame(tmp_buf,RecvLen,Item,DataFrame,DataLen,m_meter.com_para.addr);
		if ( j == 0)//解析帧
		{
			if(DataLen > 0)
			{
//			      if(Item == 0xb611)
//			      {
//			      	printf("\r\nSAVE DATA%02x%02x %d",DataFrame[0],DataFrame[1],m_meter.No);
//			      }
			
			      pShmMan->SaveDataToShm(DataFrame, m_meter.No, Item,0,DataLen);
			      //GetShmData(BYTE * data, int posNum, int item, int & dataLen)
//			      pShmMan->GetShmData(DataFrame, m_meter.No, Item,DataLen);
//			      if(Item == 0xb611)
//			      {
//			      	printf("\r\nREAD DATA%02x%02x %d\r\n",DataFrame[0],DataFrame[1],m_meter.No);
//			      }
			}
			
			else
			      pShmMan->SaveDataToShm(DataFrame, m_meter.No, Item,1,DataLen);
			return true;			
		}
		if(j == 0x0600)
		{
			pShmMan->SaveDataToShm(DataFrame, m_meter.No, Item,2,DataLen);
			return true;
		}
		
	}
	if( i >= RetryCount && j == 0xFFFF)
	{
		pShmMan->SaveDataToShm(DataFrame, m_meter.No, Item,2,DataLen);		
	}	
	return false;	
}